/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.encomendaproduto;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import model.dao.IRepositorioEncomendaProduto;
import model.daoimpl.GenericDAO;
import model.excecoes.ErroDAOException;

/**
 *
 * @author Marcos
 */
public class RepositorioEncomendaProduto extends GenericDAO<EncomendaProduto> implements IRepositorioEncomendaProduto {

    @Override
    public List<EncomendaProduto> listarEncomenda(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<EncomendaProduto> encomendas = null;
        Query query = null;

        try {
            if (consulta.equals("Todos") && campo.equals("Todos")) {
                query = this.getManager().createQuery("Select m From EncomendaProduto m JOIN FETCH m.produtos");
            } else {
                if (campo.equals("Código")) {
                    query = this.getManager().createQuery("Select m From EncomendaProduto m JOIN FETCH m.produtos Where m.id = :id");
                    query.setParameter("id", Integer.parseInt(consulta));
                } else {
                    if (campo.equals("Data da Encomenda")) {
                        query = this.getManager().createQuery("Select m From EncomendaProduto m JOIN FETCH m.produtos Where m.dataEncomenda = :dataEncomenda");
                        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
                        try {
                            query.setParameter("dataEncomenda", format.parse(consulta));
                        } catch (ParseException ex) {
                            Logger.getLogger(RepositorioEncomendaProduto.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
                        if (campo.equals("Descrição do Produto")) {
                            query = this.getManager().createQuery("Select m From EncomendaProduto m JOIN FETCH m.produtos Where m.produtos.descricao = :descricao");
                            query.setParameter("descricao", consulta);
                        }
                    }
                }
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta:\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência:\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        encomendas = query.getResultList();
        return encomendas;
    }

    @Override
    public int identificarCodigoProduto(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        int codigo = 0;

        try {
            Query query = this.getManager().createQuery("Select p.codigo From Produto p Where p.descricao = :descricao and p.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            if (query.getFirstResult() != 0) {
                codigo = query.getFirstResult();
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return codigo;
    }

    @Override
    public boolean verificarQuantidadeProduto(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;

        try {
            Query query = this.getManager().createQuery("Select e.quantidadeChegada From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao and e.produto.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            if(query.getFirstResult() < 5 ){
                verificar = true;
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return verificar;
    }

}
